#include "CardGame.h"
#include <ctime>

CardGame::CardGame()
{
	selfCards_node = Node::create();
}

//作用：将0-53的值，转变成对应的某张牌精灵
Sprite *CardGame::getCardSpriteWithValue(int value)
{
	string file_name = "";

	if (value == 52)
	{
		// 小王
		file_name = "xiaowang.png";
	}
	else if (value == 53)
	{
		// 大王
		file_name = "dawang.png";
	}
	else
	{
		// 如何得到花色？
		int flower = value / 13 + 1;
		// 牌的值？
		int _value = value % 13 + 1;
		switch (flower)
		{
		case 1: // ♠️
			file_name = StringUtils::format("hei-%d.png", _value);
			break;
		case 2: // ♦️
			file_name = StringUtils::format("fk-%d.png", _value);
			break;
		case 3: // ♣️
			file_name = StringUtils::format("mh-%d.png", _value);
			break;
		case 4: // ♥️
			file_name = StringUtils::format("hong-%d.png", _value);
			break;
		default:
			break;
		}
	}
	Sprite *cardSprite = Sprite::createWithSpriteFrameName(file_name);
	cardSprite->setTag(value);//有助于我们从父节点通关tag值找到对应的牌的精灵
	return cardSprite;
}

void CardGame::shuffle(int a[], int len)
{
    int index, temple, i;
    for (i = 0; i < 54; i++) 
	{
        a[i] = i;
    }
    srand((unsigned)time(NULL));
    for (i = len-1; i > 0; i--) 
	{
        index = rand()%i;
        // 交换i索引和index索引里储存的值
        temple = a[i];
        a[i] = a[index];
        a[index] = temple;
    }
    // 打印下洗好牌后的情况
    for (i = 0; i < len; i++) 
	{
        printf("%d ", a[i]);
    }
}

//判断是否为王炸
bool isKingBomb(vector<int>arr)
{
	if (arr[0] >= 52 && arr[1] >= 52) 
	{
		return true;
	}
	else
	{
		return false;
	}
}

//判断是否为红十炸
bool isRedTenBomb(vector<int>arr) 
{
	if ((arr[0]==22&& arr[1] == 48)|| (arr[1] == 22 && arr[0] ==48))
	{
		return true;
	}
	else
	{
		return false;
	}
}

//判断是否有王
bool hasKing(vector<int>arr)
{
	for (int i = 0; i < arr.size(); i++)
	{
		if (arr[i]>=52)
		{
			return true;
		}
		return false;
	}
}

//判断是否为对子
bool isDouble(vector<int>arr)
{
	if (hasKing(arr)) 
	{
		return false;
	}
	else if (arr[0]%13==arr[1]%13)
	{
		return true;
	}
	else
	{
		return false;
	}
}

//判断是否为炸弹
bool isThreeOrFourBomb(vector<int>arr)
{
	if (hasKing(arr))
	{
		return false;
	}
	bool allSame = true;
	for (int i = 1; i < arr.size(); i++)
	{
		if (arr[0] % 13 != arr[i] % 13)
		{
			//遇到不同的点数则直接结束
			allSame = false;
			break;
		}
	}
	if (allSame)
	{
		return true;
	}
	else 
	{
		return false;
	}
}

//判断是否为顺子
bool isStraight(vector<int>arr)
{
	if (hasKing(arr))
	{
		return false;
	}
	//A 2 3 4 5 6 7 8 9 10 J Q K A
	//至少三张连续
	vector<int>vec(14, 0);//vec用来记录每个点数的牌出现的次数
	for (int i = 0; i < arr.size(); i++)
	{
		vec[arr[i] % 13] += 1;
	}
	//如何判断既有K又有A？
	if (vec[12]>0&&vec[0]>0)
	{
		vec[0]--;
		vec[13]++;
	}
	//计算vec里面连续的1出现的次数，只要出现1后，没出现1就中断
	int count = 0;//记录连续1的次数
	for (int i = 0; i < vec.size(); i++)
	{
		if (vec[i]==1)
		{
			count++;
		}
		else if (count != 0)
		{
			break;
		}
	}
	if (count == arr.size())
	{
		return true;
	}
	else
	{
		return false;
	}
}

Pokertype CardGame::getPokerTypeWithCards(vector<int>arr)
{
	//选择的牌数
	int len = (int)arr.size();
	if (len==1)
	{
		return Pokertype::POKER_TYPE_SINGLE;
	}
	else if (len == 2)
	{
		if (isKingBomb(arr))
		{
			return Pokertype::POKER_TYPE_KING_BOMB;
		}
		else if (isRedTenBomb(arr))
		{
			return Pokertype::POKER_TYPE_REDTEN_BOMB;
		}
		else if (isDouble(arr))
		{
			return Pokertype::POKER_TYPE_DOUBLE;
		}
	}
	else if (len == 3||len==4)
	{
		if (isThreeOrFourBomb(arr))
		{
			if (len==3)
			{
				return Pokertype::POKER_TYPE_THREE_BOMB;
			}
			if (len==4)
			{
				return Pokertype::POKER_TYPE_FOUR_BOMB;
			}
		}
		if (isStraight(arr))
		{
			return Pokertype::POKER_TYPE_STRAIGHT;
		}
	}
	else if(len>=4)
	{
		if (isStraight(arr))
		{
			return Pokertype::POKER_TYPE_STRAIGHT;
		}
	}
	return Pokertype();

}


